어휘 사전
📋 문서 버전
이 문서는 2개의 버전이 있습니다. 현재 최신 버전을 보고 있습니다.
어휘 사전 (Vocabulary)
1. 개요
어휘 사전(Vocabulary)이란 자연어 처리(NLP)에서 모델이 처리할 수 있는 모든 고유한 토큰(Token, 텍스트의 최소 의미 단위)의 집합을 의미하며, 텍스트 데이터를 컴퓨터가 이해할 수 있는 수치형 벡터로 변환하기 위한 기초 매핑 테이블 역할을 한다.
2. 어휘 사전 구축 과정
어휘 사전 구축은 원시 텍스트(Raw Text)를 정수 인덱스로 변환하는 정형화된 과정을 거친다.
2.1 구축 단계
- 토큰화(Tokenization): 문장을 단어, 형태소, 혹은 문자 단위의 토큰으로 분리한다.
- 고유 단어 추출: 전체 말뭉치(Corpus)에서 중복을 제거하여 유일한 토큰들의 집합을 생성한다.
- 인덱싱(Indexing): 각 고유 토큰에 0부터 시작하는 고유한 정수 번호를 부여한다.
2.2 변환 예시
사전 정의: {"나": 0, "는": 1, "학교": 2, "에": 3, "간다": 4, "집": 5, "으로": 6}
| 원문 텍스트 | 토큰화 결과 | 인덱스 변환 (Mapping) |
|---|---|---|
| "나는 학교에 간다" | ["나", "는", "학교", "에", "간다"] |
[0, 1, 2, 3, 4] |
| "학교에 간다" | ["학교", "에", "간다"] |
[2, 3, 4] |
| "나는 집으로 간다" | ["나", "는", "집", "으로", "간다"] |
[0, 1, 5, 6, 4] |
2.3 양방향 매핑 구조
효율적인 데이터 처리를 위해 어휘 사전은 일반적으로 두 가지 형태의 딕셔너리 구조를 동시에 유지한다.
- Word-to-Index (Forward Mapping): 텍스트를 입력받아 모델에 넣을 정수 인덱스로 변환할 때 사용한다. (예: {"나": 0, "는": 1, ...})
- Index-to-Word (Backward Mapping): 모델이 출력한 정수 인덱스를 다시 사람이 읽을 수 있는 텍스트로 복원(Decoding)할 때 사용한다. (예: {0: "나", 1: "는", ...})
3. 특수 토큰 (Special Tokens)
표준적인 단어 외에 모델의 구조적 제어나 예외 상황 처리를 위해 정의된 특수 토큰들이 존재한다.
[PAD](Padding): 입력 문장들의 길이를 동일하게 맞추기 위해 빈 공간을 채우는 토큰이다. 연산 시 무시되도록 설정된다.[UNK](Unknown): 어휘 사전에 등록되지 않은 단어(OOV)가 등장했을 때 이를 대체하는 토큰이다.[SOS](Start of Sentence): 문장의 시작을 알리는 토큰으로, 주로 Seq2Seq나 LLM과 같은 생성 모델에서 첫 토큰으로 입력된다.[EOS](End of Sentence): 문장의 끝을 알리는 토큰으로, 모델이 텍스트 생성을 멈춰야 하는 시점을 판단하게 한다.[CLS](Classification): 문장 전체의 의미를 대표하는 토큰으로, 주로 BERT와 같은 모델에서 분류 작업의 입력으로 사용된다.[SEP](Separator): 두 개의 문장을 구분하거나 문장의 끝을 알리는 구분자 토큰이다.
4. 어휘 사전의 크기와 최적화
사전의 크기(Vocabulary Size)는 모델의 성능과 자원 효율성 사이의 트레이드-오프(Trade-off) 관계에 있다.
4.1 사전 크기의 영향
- 크기가 너무 클 때: 모델의 임베딩 층(Embedding Layer) 파라미터가 급증하여 메모리 사용량이 늘어나고, 희소 단어(Rare words)에 대한 학습 부족으로 과적합(Overfitting) 위험이 커진다.
- 크기가 너무 작을 때: 너무 많은 단어가
[UNK]토큰으로 처리되어 정보 손실이 발생하고 모델의 표현력이 저하된다.
4.2 최적화 방법: 빈도수 기반 필터링 (Min-count)
전체 말뭉치에서 등장 횟수가 매우 적은 단어(예: 5회 미만 등장)를 제거하고 [UNK]로 통합하는 방식이다. 이를 통해 노이즈를 제거하고 모델의 일반화 성능을 높일 수 있다.
5. 어휘 사전의 한계와 발전
5.1 OOV(Out-of-Vocabulary) 문제
OOV 문제란 학습 단계의 어휘 사전에는 없었으나, 추론(Test) 단계에서 새로운 단어가 등장하여 모델이 해당 단어를 처리하지 못하고 모두 [UNK]로 치환해버리는 현상을 말한다. 이는 신조어, 오타, 혹은 복합어의 조합으로 인해 발생하며, 모델의 정보 손실을 야기한다.
5.2 서브워드 분절법 (Subword Segmentation)
단어를 더 작은 단위(Subword)로 쪼개어 사전의 크기를 제한하면서도 모든 단어를 표현할 수 있게 하여 OOV 문제를 해결한다.
BPE (Byte Pair Encoding)와 WordPiece 비교
| 구분 | BPE (Byte Pair Encoding) | WordPiece |
|---|---|---|
| 병합 기준 | 가장 빈번하게 등장하는 문자 쌍 (Frequency) | 가능도(Likelihood)를 최대화하는 쌍 |
| 특징 | 단순 빈도 기반의 반복적 병합 | 통계적 확률 기반의 병합 |
| 대표 모델 | GPT 시리즈, RoBERTa | BERT |
| 목표 | 빈도수가 높은 조합을 하나의 토큰으로 통합 | 전체 말뭉치의 가능도를 높이는 방향으로 분절 |
5.3 BPE 작동 원리 예시 코드
import collections
def get_stats(ids):
counts = collections.defaultdict(int)
for i in range(len(ids)-1):
counts[(ids[i], ids[i+1])] += 1
return counts
def merge(ids, pair):
new_ids = []
i = 0
while i < len(ids):
if i < len(ids)-1 and (ids[i], ids[i+1]) == pair:
new_ids.append(pair[0] + pair[1]) # 병합된 토큰 생성
i += 2
else:
new_ids.append(ids[i])
i += 1
return new_ids
# 초기 데이터: 각 단어를 문자 단위로 분리
words = ["hug", "pug", "pun", "bun"]
# 단순화를 위해 각 단어를 리스트로 표현
ids = ["h", "u", "g", "p", "u", "g", "p", "u", "n", "b", "u", "n"]
# 1회차 병합: 가장 빈번한 쌍 (u, g) 또는 (u, n) 중 하나 선택
stats = get_stats(ids)
best_pair = max(stats, key=stats.get) # 예: ('u', 'g')
ids = merge(ids, best_pair)
print(f"1차 병합 후: {ids}") # ['h', 'ug', 'p', 'ug', 'p', 'u', 'n', 'b', 'u', 'n']
# 2회차 병합: 다음 빈번한 쌍 (u, n) 선택
stats = get_stats(ids)
best_pair = max(stats, key=stats.get) # ('u', 'n')
ids = merge(ids, best_pair)
print(f"2차 병합 후: {ids}") # ['h', 'ug', 'p', 'ug', 'p', 'un', 'b', 'un']
# 결과적으로 'bug'라는 새로운 단어가 들어와도 [b, ug] 혹은 [b, u, g]로 표현 가능하여 OOV 해결
6. 활용 및 주의사항
6.1 임베딩 층(Embedding Layer)과의 연결성
어휘 사전의 인덱스는 모델의 첫 번째 층인 임베딩 층의 행 인덱스로 직접 연결된다.
- 작동 프로세스:
단어$\rightarrow$사전 인덱스(Integer)$\rightarrow$임베딩 벡터(Float Vector)- 상세 원리:
- Word2Vec, FastText: 사전의 각 인덱스에 대응하는 고정된 크기의 밀집 벡터(Dense Vector)를 학습한다.
- 모델은 입력받은 정수 인덱스를 사용하여 임베딩 행렬(Embedding Matrix)에서 해당 행의 벡터를 추출(Lookup)하며, 이 벡터가 신경망의 실제 연산에 활용된다.
6.2 구축 시 주의사항
- 사전 일치(Vocabulary Consistency): 학습 데이터로 구축한 사전을 테스트 데이터 및 실제 서비스 환경에서도 동일하게 사용해야 한다. 인덱스가 하나라도 밀리면 모델은 완전히 다른 단어로 인식한다.
- 도메인 특화 사전: 의료, 법률, IT 등 전문 분야의 텍스트를 처리할 때는 일반적인 사전보다 해당 도메인의 전문 용어가 충분히 반영된 특화 사전을 구축하거나, 기존 사전에 전문 용어를 추가하는 과정이 필요하다.
데이터 전처리 및 정제 (Preprocessing)
토큰화 이전 단계에서 수행되는 정규화(Normalization)와 정제(Cleaning)는 어휘 사전의 효율성과 품질을 결정짓는 핵심 요소이다.
- 정규화(Normalization): 동일한 의미를 가진 서로 다른 표기법을 하나로 통일하는 과정이다. (예: "USA", "U.S.A.", "United States" $\rightarrow$ "USA") 이를 통해 불필요하게 사전 크기가 커지는 것을 방지하고 데이터 희소성(Sparsity) 문제를 완화한다.
- 정제(Cleaning): 분석 목적에 불필요한 노이즈를 제거하는 과정이다. HTML 태그, 특수문자, 반복되는 자음/모음(예: "ㅋㅋㅋ", "ㅠㅠ") 등을 제거하거나 치환하여 사전의 순도를 높인다.
- 영향: 정제가 미흡할 경우, 의미 없는 토큰이 사전에 대량 등록되어 모델이 중요한 단어보다 노이즈에 더 많은 가중치를 두는 현상이 발생할 수 있다.
SentencePiece 알고리즘
최신 LLM(Llama, T5 등)에서 널리 사용되는 SentencePiece는 Unigram Language Model 기반의 서브워드 분절법으로, 사전 학습된 언어 모델의 확률론적 접근 방식을 사용한다.
작동 원리 도식도
graph TD
A[Raw Text] --> B[Normalization/NFKC]
B --> C[Initial Large Vocabulary]
C --> D{Probability-based Pruning}
D -->|Loss Calculation| E[Remove tokens that least impact likelihood]
E --> D
D -->|Target Size Reached| F[Final Optimized Vocabulary]
F --> G[Subword Segmentation via Viterbi Algorithm]
특징 및 비교
- 언어 독립성: BPE와 달리 공백(Whitespace)을 하나의 특수 기호(
_)로 취급하여 처리하므로, 띄어쓰기가 없는 언어(중국어, 일본어 등)에서도 별도의 형태소 분석기 없이 적용 가능하다. - 확률적 분절: 고정된 규칙이 아니라, 전체 말뭉치의 가능도(Likelihood)를 최대화하는 최적의 분절 조합을 확률적으로 선택한다.
데이터 편향 해결 및 샘플링 전략
불균형한 데이터셋으로 사전을 구축하면 특정 도메인의 단어가 과하게 대표되거나, 희귀하지만 중요한 단어가 누락되는 데이터 편향(Data Bias) 문제가 발생한다.
구체적인 샘플링 기법
- 층화 샘플링 (Stratified Sampling): 데이터셋을 도메인, 언어, 혹은 문서 유형별로 층(Strata)을 나누어 각 층에서 일정 비율로 데이터를 추출함으로써 특정 범주의 데이터가 지배하는 것을 방지한다.
- TF-IDF 기반 가중치 샘플링: 단순히 빈도수가 높은 단어만 남기는 것이 아니라, 특정 문서에서만 중요하게 등장하는 단어(TF-IDF 값이 높은 단어)를 보존하여 희귀 전문 용어의 누락을 막는다.
- 언더샘플링 (Undersampling): 과하게 반복되는 정형 텍스트(예: 웹페이지 하단의 공통 푸터, 반복되는 공지사항)를 강제로 제거하여 사전의 노이즈를 줄인다.
다국어 어휘 사전 (Multilingual Vocabulary)
여러 언어를 하나의 모델로 처리하기 위해 개별 언어 사전을 통합한 Shared Vocabulary 구조를 사용한다.
Shared Vocabulary의 개념 및 예시
서로 다른 언어라도 문자 체계가 같거나(라틴 문자), 의미적으로 유사한 서브워드 단위를 공유함으로써 사전 효율성을 극대화한다.
- 토큰 공유 예시:
- 공통 문자: 영어의
apple과 프랑스어의apple(외래어)은 동일한 토큰 인덱스를 공유한다. - 서브워드 공유:
inter-(국제적인)라는 접두사는 영어(international), 프랑스어(international), 스페인어(internacional)에서 공통적으로 추출되어 하나의 토큰으로 관리될 수 있다.
- 공통 문자: 영어의
- 전이 학습(Transfer Learning) 효과: 공유된 토큰을 통해 모델은 한 언어에서 학습한 개념적 의미를 다른 언어로 전이할 수 있으며, 이는 저자원 언어(Low-resource Language)의 성능을 고자원 언어의 지식으로 보완하는 효과를 낳는다.
어휘 사전의 동적 확장 및 관리
모델 배포 후 새로운 도메인 데이터나 신조어가 등장할 때, 기존 사전을 유지하며 확장하는 기법이 필요하다.
Dynamic Vocabulary 및 확장 방안
- Vocabulary Expansion: 기존 임베딩 행렬의 크기를 늘리고 새로운 토큰을 추가하는 방식이다. 이때 기존 토큰의 인덱스는 유지하고, 새로운 토큰을 끝에 추가하여 인덱스 불일치를 방지한다.
- 인덱스 불일치 해결:
- Weight Initialization: 새 토큰의 임베딩 벡터를 무작위로 초기화하는 대신, 의미적으로 유사한 기존 토큰의 벡터 평균값으로 초기화하여 학습 수렴 속도를 높인다.
- Mapping Table 업데이트:
Word-to-Index맵을 버전 관리하여, 추론 시 사용되는 사전 버전과 모델의 임베딩 층 버전이 일치하도록 강제하는 체크섬(Checksum) 메커니즘을 도입한다.
이 문서는 AI 모델(gemma-4-31b)에 의해 생성된 콘텐츠입니다.
주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.